package com.cy.config;

import com.mysql.cj.util.StringUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.SessionContext;
import org.apache.shiro.session.mgt.SimpleSession;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;
import java.util.UUID;

/**
 * @author wxhn1
 */
public class MySessionManager extends DefaultWebSessionManager {
	private static final String AUTHORIZATION = "token";
	private String id;
	
	public MySessionManager() {
		super();
		// 不将session写入到Cookie
		this.setSessionIdCookieEnabled(false);
	}
	
	// 修改session创建方式
	@Override
	public Session createSession(SessionContext initData) {
		if (initData != null) {
			String host = initData.getHost();
			if (host != null) {
				// 仅这里修改创建方式 其他都是官方代码
				SimpleSession ss = new SimpleSession(host);
				// 如果本次请求没有带token  就随机一个uuid作为会话id 否则使用携带的token作为会话id
				if (StringUtils.isNullOrEmpty(id) || "null".equals(id)) {
					ss.setId(UUID.randomUUID().toString());
				} else {
					ss.setId(id);
				}
				return ss;
			}
		}
		return new SimpleSession();
	}
	
	@Override
	protected Serializable getSessionId(ServletRequest request , ServletResponse response) {
		// 这里是shiro框架每次请求都会获取会话id 改成从请求头获取会话id
		// 如果请求时不携带token 则会每次请求都创建一个会话
		id = WebUtils.toHttp(request).getHeader("token");
		if (!StringUtils.isNullOrEmpty(id)) {
			System.out.println("id:" + id);
			return id;
		} else {
			return super.getSessionId(request , response);
		}
	}
}
